<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>5-自定义指令</title>
		<link rel="stylesheet" href="../../css/css01.css" />
		<script type="text/javascript" src="../../lib/vue/vue.min.js" ></script>
	</head>
	<body class="dbody">
		<h1>1- 自定义指令</h1>
		<p>页面加载的时候自动focus</p>
		<h2>全局自定义指令</h2>
		<div id="app">
			<input v-focus />
		</div>
		<script>
			Vue.directive('focus',{
				//当绑定元素插入到DOM中
				inserted:function(e1){
					console.log("--->聚焦元素");
					//聚焦元素
					e1.focus();
				}
			})
			new Vue({
				el:"#app"
			})
		</script>
		<h2>局部自定义指令</h2>
		<div id="app2">
			<button v-mouseover2>{{msg}}</button>
		</div>
		
		<script>
			new Vue({
				el:"#app2",
				data:{
					msg:"按钮文字"
				},
				directives:{
					mouseover2:{
						inserted:function(e1){
							console.log("->"+e1);
							console.log("-->"+e1.text);
							console.log("--->"+this.msg);//此时未定义msg
							this.msg="按钮文字改变";
							console.log("---->"+this.msg);
						}
					}
				}
			})
		</script>
		
		<h1>2-钩子函数</h1>
		<pre>
			<h2>指令定义函数提供了几个钩子函数（可选）：</h2>
			bind: 只调用一次，指令第一次绑定到元素时调用，用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
			inserted: 被绑定元素插入父节点时调用（父节点存在即可调用，不必存在于 document 中）。
			update: 被绑定元素所在的模板更新时调用，而不论绑定值是否变化。通过比较更新前后的绑定值，可以忽略不必要的模板更新（详细的钩子函数参数见下）。
			componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
			unbind: 只调用一次， 指令与元素解绑时调用。
			<h2>钩子函数的参数</h2>
			el: 指令所绑定的元素，可以用来直接操作 DOM 。
			binding: 一个对象，包含以下属性：
					name: 指令名，不包括 v- 前缀。
					value: 指令的绑定值， 例如： v-my-directive="1 + 1", value 的值是 2。
					oldValue: 指令绑定的前一个值，仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
					expression: 绑定值的字符串形式。 例如 v-my-directive="1 + 1" ， expression 的值是 "1 + 1"。
					arg: 传给指令的参数。例如 v-my-directive:foo， arg 的值是 "foo"。
					modifiers: 一个包含修饰符的对象。 例如： v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。
			vnode: Vue 编译生成的虚拟节点，查阅 VNode API 了解更多详情。
			oldVnode: 上一个虚拟节点，仅在 update 和 componentUpdated 钩子中可用。
		</pre>
		<div id="app3"  v-runoob:hello.a.b="message"></div>
		<script>
			Vue.directive('runoob', {
			  bind: function (el, binding, vnode) {
			    var s = JSON.stringify
			    el.innerHTML =
			      'name: '       + s(binding.name) + '<br>' +
			      'value: '      + s(binding.value) + '<br>' +
			      'expression: ' + s(binding.expression) + '<br>' +
			      'argument: '   + s(binding.arg) + '<br>' +
			      'modifiers: '  + s(binding.modifiers) + '<br>' +
			      'vnode keys: ' + Object.keys(vnode).join(', ')
			  }
			})
			new Vue({
			  el: '#app3',
			  data: {
			    message: '菜鸟教程!'
			  }
			})
		</script>
		<br />
		<h1>在钩子中使用原生js表达式</h1>
		<div id="app4">
		    <div v-run="{ color: 'green', text: '菜鸟教程!' }"></div>
		</div>
		
		<script>
			Vue.directive('run', function (el, binding) {
				// 简写方式设置文本及背景颜色
				el.innerHTML = binding.value.text
				el.style.backgroundColor = binding.value.color
			})
			new Vue({
			  el: '#app4'
			})
		</script>
		
		
	</body>
</html>
